作业一:学生学籍管理程序
学生学籍管理通常使用数据库为基础的管理信息系统(MIS)系统,但是我们这里要求不使用数据库技术,而是使用数据结构struct和链表操作完成管理任务。
作业描述
使用数据结构表示学生,记录学生的相关信息;学生信息包括:学号sno、姓名sname、年龄sage、专业sprof、班级sclass。请设计合理的数据结构,容纳这些信息。
完成学生的添加、修改、删除和查询等基本常用操作。
使用链表表示学生所在班级队列。
背景知识
1. 数据结构。
2. 链表。
代码实现如下:
发现简单的代码也不好写。
越写考虑的越多,还有很多想到的部分没实现,毕竟是伪界面,就这样吧。
代码框架如下:
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
class Student {
private :
char sno[15];
int sage;
char sclass[15];
char sname[15];
char sprof[15];
Student *next;
typedef Student* Stu;
public :
Student() {
//构造函数,初始化链表
}
void Insert(Student &stu) {
//插入操作
}
bool Search(char cur_sno[], Stu &res_pre) {
//查找操作
}
bool Delete(char Delete_sno[]) {
//删除操作
}
void Modify(Student &stu) {//修改操作
//输入修改学生信息保存到stu(插入部分的具体实现其实在Modify_info中)
}
//以上是链表插入删除,查找修改的基本操作
/*---------------------------------------------------------------*/
void Input_Stu_Info(Student &stu) {
//输入学生信息(除主码sno外)的函数
}
void Back_Or_Not(int n) {
//是否返回主界面的函数
}
void Check_back_root(char str[]) {
//异常而无法返回主菜单时做的处理。
}
int Input() {//输入处理,字符串读入,做简单的排错处理
}
void Frame() {//界面
}
//以上是浮云...
/*---------------------------------------------------------------*/
void Add_info() {
//增加学生记录实现函数
//输入学号信息,调用欧冠Insert()插入
}
void Modify_info() {
//修改学生记录实现函数
//输入学号信息,调用欧冠Modify()修改
}
void Delete_info() {
//删除学生记录实现函数
//输入学号信息,调用欧冠Delete()删除
}
void Search_info() {
//查找学生记录实现函数
//输入学号信息,调用Search()进行查找
}
void Print_All() {
//输出所有学生记录实现函数
}
//以上是学籍管理程序的5个主要函数实现部分
/*---------------------------------------------------------------*/
};
int main() {
Student StuList;
StuList.Frame();
return 0;
}
代码实现如下:
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
class Student {
private :
char sno[15];
int sage;
char sclass[15];
char sname[15];
char sprof[15];
Student *next;
typedef Student* Stu;
public :
Student() {
memset(sno, 0, sizeof(sno));
memset(sname, 0, sizeof(sclass));
memset(sname, 0, sizeof(sname));
memset(sprof, 0, sizeof(sprof));
next = NULL;
}
void Insert(Student &stu) {
Stu p = this;
while (p->next && strcmp(p->next->sno, stu.sno) < 0) {
p = p->next;
}
Stu tmp = p->next;
p->next = &stu;
p = p->next;
p->next = tmp;
}
bool Search(char cur_sno[], Stu &res_pre) {
Stu p = this;
while (p->next) {
if (strcmp(p->next->sno, cur_sno) == 0) {
res_pre = p;//res保存结果的前驱指针
//printf("%s--\n", res_pre->next->sno);
return true;
}
p = p->next;
}
return false;
}
bool Delete(char Delete_sno[]) {
Stu res_pre = this;
if (Search(Delete_sno, res_pre)) {
Stu res = res_pre->next;
res_pre->next = res->next;
delete(res);
puts("\t删除信息成功");
return true;
} else {
puts("\t该生不存在,请检查后重新输入!");
return false;
}
}
void Modify(Student &stu) {
printf("\t待修改的学生%s的学籍信息如下:", stu.sno);
puts("\t姓名\t年龄\t专业\t班级");
printf("\t%s\t%d\t%s\t%s\n", stu.sname, stu.sage, stu.sprof, stu.sclass);
printf("\t输入修改后的该学生信息(按以上顺序):\n");
Input_Stu_Info(stu);
}
/*----------------------------------------------------------------------------*/
void Input_Stu_Info(Student &stu) {
printf("\t");
scanf("%s", stu.sname);
Check_back_root(stu.sname);
printf("\t");
int check_age = Input();
if (check_age >= 0 && check_age <= 100) {
stu.sage = check_age;
}
printf("\t");
scanf("%s", stu.sprof);
Check_back_root(stu.sprof);
printf("\t");
scanf("%s", stu.sclass);
Check_back_root(stu.sclass);
printf("\n");
}
void Back_Or_Not(int n) {
puts(" ═════ 继续当前操作请按0, 返回主界面请按1 ═════\n");
int check_in = Input();
while (!(check_in >= 0 && check_in <= 1)) {
printf("您选择的编号错误,请重新选择: ");
check_in = Input();
}//输入的异常处理
if (check_in == 0) {
switch(n) {
case 1: Add_info(); break;
case 2: Modify_info(); break;
case 3: Delete_info(); break;
case 4: Search_info(); break;
default : break;
}
} else {
Frame();
}
}
void Check_back_root(char str[]) {
if (strcmp(str, "250") == 0) {
Frame();
}
}
int Input() {//输入处理,做简单的排错处理
int i, k = 0;
char stmp[110], str[110];
scanf("%s", str);
Check_back_root(str);
for (i = 0; str[i]; i++) {
if (!(str[i] >= '0' && str[i] <= '9')) {
return -1;
} else {
stmp[k++] = str[i];
}
}
int r = 1, sum = 0;
for (i = k - 1; i >= 0; i--, r *= 10) {
sum += (str[i] - '0') * r;
}
return sum;
}
void Frame() {
system("cls");
puts("╓**************************学生学籍管理程序**************************╖");
puts("║ ║");
puts("║ Author info -- class: abcdefgh name: XXX stu.no: 33333333 ║");
puts("╠════════════════╦═════════════════╣");
puts("║ ║ ║");
puts("║ 1:添加学生记录 ║ 2:修改学生记录 ║");
puts("║ ║ ║");
puts("╠════════════════╬═════════════════╣");
puts("║ ║ ║");
puts("║ 3:删除学生记录 ║ 4: 查询学生记录 ║");
puts("║ ║ ║");
puts("╠════════════════╬═════════════════╣");
puts("║ ║ Notice: 任何不可返回的异常情况可 ║");
puts("║ 5:显示所有学生记录 ║ (此情况下任何学生信息不可是250) ║");
puts("║ ║ 输入250返回主菜单 ║");
puts("╚════════════════╩═════════════════╝"); //这个的戳,主要是因为这里的字体,复制出来就好了。。
printf("请输入编号:");
int check_in = Input();
while (!(check_in >= 1 && check_in <= 6)) {
printf("您选择的编号错误,请重新选择: ");
check_in = Input();
}//输入的异常处理
switch(check_in) {//建立关联
case 1:
Add_info();
case 2:
Modify_info();
break;
case 3:
Delete_info();
break;
case 4:
Search_info();
break;
case 5:
Print_All();
break;
default :break;
}
}
/*----------------------------------------------------------------------------*/
void Add_info() {
system("cls");
puts("╓********************添加学生记录信息************************╖\n");
puts(" Notice: 任何不可返回的异常情况可输入250返回主菜单 \n");
puts("\t输入顺序如下(学号作为主码)\n");
puts("\t学号\t姓名\t年龄\t专业\t班级\n");
Student stu, *res_pre = this;
char stmp[110], str[110];
bool flag, OK = false;
int i, k = 0;
while (!OK) {
printf("\t");
scanf("%s", str);
Check_back_root(str);
flag = false;
while (!flag) {
flag = true;
k = 0;
for (i = 0; str[i]; i++) {
if (!(str[i] >= '0' && str[i] <= '9')) {
flag = false;
break;
} else {
stmp[k++] = str[i];
}
}
}
stmp[k] = 0;
if (Search(str, res_pre)) {
puts("\t学生学号不可重复,该学号的记录已存在,请检查后重新输入。");
} else {
OK = true;
}
}
strcpy(stu.sno, stmp);
Input_Stu_Info(stu);
Insert(stu);
puts(" congratulation! 添加记录成功!\n");
Back_Or_Not(1);
}
void Modify_info() {
char str[110];
Stu res_pre = this;
system("cls");
puts("╓********************修改学生记录信息************************╖\n");
puts(" Notice: 任何不可返回的异常情况可输入250返回主菜单 \n");
printf("\t请输入待修改信息的学生学号:\n\t");
scanf("%s", str);
Check_back_root(str);
while (!Search(str, res_pre)) {
puts("\t您输入的学生信息不存在,请检查后重新输入");
printf("\t");
scanf("%s", str);
Check_back_root(str);
}
Modify(*(res_pre->next));
puts(" congratulation! 修改记录成功!\n");
Back_Or_Not(2);
}
void Delete_info() {
system("cls");
char str[110];
puts("╓**********************删除学生记录信息**********************╖\n");
puts(" Notice: 任何不可返回的异常情况可输入250返回主菜单 \n");
printf("\t请输入待删除信息的学生学号:\n\t");
scanf("%s", str);
Check_back_root(str);
while (!Delete(str)) {
//puts("\t该记录不存在,请检查后重新输入:");Delete里已有
printf("\t");
scanf("%s", str);
Check_back_root(str);
}
Back_Or_Not(3);
}
void Search_info() {
system("cls");
char str[110];
Stu res_pre = this;
puts("╓**********************查询学生记录信息**********************╖\n");
puts(" Notice: 任何不可返回的异常情况可输入250返回主菜单 \n");
printf("\t请输入需查询信息的学生学号:\n\t");
scanf("%s", str);
Check_back_root(str);
while (!Search(str, res_pre)) {
puts("\t不存在该记录,请检查后重新输入:");
printf("\t");
scanf("%s", str);
Check_back_root(str);
}
Student stu = *(res_pre->next);
printf(" 查询结果如下:");
puts("\t学号\t姓名\t年龄\t专业\t班级\n");
printf("\t%s\t%s\t%d\t%s\t%s\n", stu.sno, stu.sname, stu.sage, stu.sprof, stu.sclass);
Back_Or_Not(4);
}
void Print_All() {
system("cls");
Stu p = this;
Student stu;
puts("╓*********************输出所有学生记录信息**********************╖\n");
puts(" Notice: 任何不可返回的异常情况可输入250返回主菜单 \n");
if (!p->next) {
puts("\t记录为空!");
}
puts("\t学号\t姓名\t年龄\t专业\t班级\n");
for ( ; p->next; p = p->next) {
stu = *p->next;
printf("\t%s\t%s\t%d\t%s\t%s\n", stu.sno, stu.sname, stu.sage, stu.sprof, stu.sclass);
}
system("pause");
Frame();
system("cls");
}
};
int main() {
Student StuList;
StuList.Frame();
return 0;
}
原创文章如转载请注明:转自¥忘%风 {http://www.cnblogs.com/slave_wc}
本文地址: 《操作系统》课程作业(作业一:学生学籍管理程序)
浙公网安备 33010602011771号